
2025 年,全球超過 60% 的生產環境運行在容器化平台上,Kubernetes 已經是事實上的標準。然而大部分的 K8s 安全指南停留在「強化清單」層次——告訴你該做什麼,卻沒解釋攻擊者怎麼打進來。
如果你不了解攻擊者的思維路徑,防禦就只是打勾而已。
這就是為什麼我們需要 MITRE ATT&CK。
本篇是全系列的基石——上半場帶你走一遍 ATT&CK Containers Matrix 的 10 個戰術 × 28 個技術,下半場直接動手把 KOAD 靶場跑起來。讀完這篇,你會有兩樣東西:一張攻擊全景圖,和一座可以親手操作的靶場。
完成本日實作後,你將能夠:
如果你已經熟悉 Docker 和 K8s 架構,可以直接跳到下一節「什麼是 MITRE ATT&CK」。
傳統部署中,應用程式直接跑在作業系統上,共用函式庫。一個更新壞了,其他應用跟著掛。
容器把應用程式和它的所有依賴(程式碼、函式庫、設定)打包成獨立的單元——不管放到哪台機器上都能跑,互不干擾。
| 比較 | 虛擬機 (VM) | 容器 (Container) |
|---|---|---|
| 隔離方式 | 獨立的 OS 核心 | 共用 OS 核心,Namespace 隔離 |
| 啟動時間 | 分鐘級 | 秒級 |
| 資源佔用 | GB 級(含完整 OS) | MB 級(只有應用+依賴) |
| 安全隔離 | 強(硬體級別) | 較弱(共用核心,可能逃逸) |
最後一點正是本系列的核心——容器共用宿主機核心,隔離配置不當就能「逃逸」到宿主機。Day 8–13 會拆解六種逃逸手法。
Docker 是最主流的容器引擎。核心概念只有三個:
如果你已經裝好 Docker,花兩分鐘跑一下:
# 1. 跑第一個容器(會自動下載映像)
docker run hello-world
# 2. 進入一個 Ubuntu 容器(-it = 互動模式)
docker run -it ubuntu bash
# 在容器內試試:
ls / # 看到的是容器自己的檔案系統
cat /etc/os-release # Ubuntu,不是你的宿主機
exit # 離開容器
# 3. 查看目前的容器和映像
docker ps -a # 列出所有容器(含已停止的)
docker images # 列出本機的映像
如果還沒裝 Docker,沒關係——後面的 KOAD 靶場用 Minikube,會自動處理容器環境。這裡只是讓你感受一下「容器是什麼」。
一個容器很簡單,但生產環境有幾百個容器——誰來決定容器跑在哪台機器、掛了自動重啟、流量怎麼分配?
Kubernetes(K8s) 就是容器的「管理平台」。它負責自動調度、自動修復、負載均衡、滾動更新。
K8s 架構分兩層:

| 元件 | 角色 | 被打穿 = ? |
|---|---|---|
| API Server | 所有 kubectl 指令的入口 | 整個叢集被控制(Day 2) |
| etcd | 儲存所有 Secret、RBAC 設定 | 所有機密外洩(Day 16) |
| kubelet | 每個 Node 上的 agent,管理 Pod | Node 被控制(Day 2) |
| 概念 | 一句話 | 類比 |
|---|---|---|
| Pod | 最小部署單位,裡面跑 1+ 個容器 | 一個房間裡住 1–2 人 |
| Deployment | 管理 Pod 的複本數量和更新 | 物業管理公司 |
| Service | 為 Pod 提供穩定的網路入口 | 大樓門牌號碼 |
| Namespace | 叢集內的虛擬分區 | 不同樓層 |
| ConfigMap | 儲存非敏感設定 | 公告欄 |
| Secret | 儲存敏感資料(但預設只是 Base64,不是加密!) | 沒上鎖的保險箱 |
| ServiceAccount (SA) | Pod 的身份,決定能存取什麼 API | 員工證 |
| RBAC | 角色型存取控制——誰能做什麼 | 門禁系統 |
| NetworkPolicy | 控制 Pod 間的網路流量 | 防火牆規則 |
| DaemonSet | 每個 Node 都跑一個 Pod | 每層樓的保全 |
| CronJob | 定期執行的任務 | 排班表 |
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge)是由 MITRE 維護的攻擊知識庫。它把真實世界中觀察到的攻擊手法,按照**戰術(Tactics)和技術(Techniques)**兩個維度進行分類:
ATT&CK 有多個矩陣(Enterprise、Mobile、ICS),而 2021 年正式加入的 Containers Matrix 專門描述容器與編排平台的攻擊面。
| 用途 | 說明 |
|---|---|
| 威脅建模 | 用 ATT&CK 作為框架,系統性盤點叢集面對的威脅 |
| 偵測規則設計 | 每個 Technique 對應具體的 syscall / API 行為,可直接轉化為 Falco 規則 |
| 紅隊演練 | 按 Kill Chain 順序模擬完整攻擊路徑,驗證防禦有效性 |
| 合規對照 | 將 CKS 考試領域、CIS Benchmark 項目對應到 ATT&CK 技術 |
| 安全成熟度評估 | 計算「我的偵測規則覆蓋了多少 Technique」作為量化指標 |
Containers Matrix 定義了攻擊者從入侵容器化環境到造成影響的完整殺傷鏈。以下逐一拆解每個戰術和對應技術。
攻擊者如何取得在容器環境中的第一個立足點。
| 技術 ID | 技術名稱 | 說明 | 攻擊難度 |
|---|---|---|---|
| T1190 | Exploit Public-Facing Application | 利用對外服務的漏洞(如 SSRF)滲透進叢集 | 中 |
| T1133 | External Remote Services | 暴露的管理介面——kubelet API、Dashboard、SSH | 低 |
| T1078 | Valid Accounts | 取得合法憑證——洩漏的 kubeconfig、雲端 IAM | 低 |
KOAD 場景: S01 SSRF 漏洞 Web App、S02 暴露的 kubelet、S03 洩漏的 kubeconfig
現實案例: 2022 年某電商因 SSRF 漏洞被打穿 Metadata API,攻擊者取得雲端 IAM 憑證後橫向移動至生產資料庫。這正是 T1190 的經典路線。
攻擊者視角: 初始存取是整條 Kill Chain 最關鍵的一步——進不去就什麼都做不了。在 K8s 環境中,最常見的入口不是什麼零日漏洞,而是暴露的管理介面和洩漏的 kubeconfig。Shodan 上隨時能找到數千個暴露的 kubelet 連接埠。
攻擊者取得立足點後,如何在容器環境中執行指令。
| 技術 ID | 技術名稱 | 說明 | 攻擊難度 |
|---|---|---|---|
| T1059 | Command and Scripting Interpreter | Web Shell、反向 Shell、腳本執行 | 低 |
| T1609 | Container Administration Command | 使用 kubectl/docker 等管理工具操作叢集 | 低 |
| T1610 | Deploy Container | 部署惡意容器(特權 Pod、挖礦容器) | 中 |
| T1053 | Scheduled Task/Job | 建立 CronJob 定期執行惡意任務 | 中 |
| T1204 | User Execution | 誘導管理員執行惡意 YAML(社交工程) | 中 |
KOAD 場景: S04 Jupyter Web Shell、S05 kubectl 控制叢集、S06 部署特權 Pod、S07 CronJob 持久化、S08 釣魚 Pod
關鍵觀念: 在 K8s 中,「執行」不只是跑一條指令。部署一個 Pod 本身就是一種執行——而且一旦 Pod 啟動,攻擊者就有了持續運行的工作負載。kubectl apply -f evil-pod.yaml 這一條指令就足以在叢集中開啟一個永久的立足點。
攻擊者如何確保失去初始存取後仍能回來。
| 技術 ID | 技術名稱 | 說明 | 攻擊難度 |
|---|---|---|---|
| T1098 | Account Manipulation | 竄改 RBAC 綁定,給攻擊者帳號提權 | 低 |
| T1136 | Create Account | 建立隱藏的 ServiceAccount 並綁定高權限 | 低 |
| T1543 | Create/Modify System Process | 透過 Mutating Webhook 注入惡意 Sidecar | 高 |
| T1133 | External Remote Services | 維持外部遠端存取管道 | 中 |
| T1525 | Implant Internal Image | 將後門映像推入內部 Registry | 中 |
| T1053 | Scheduled Task/Job | CronJob 作為持久化機制 | 中 |
| T1078 | Valid Accounts | 維持已竊取的合法帳號存取 | 低 |
KOAD 場景: S09 RBAC 竄改、S10 後門 SA、S11 Sidecar 注入、S12 映像植入
關鍵觀念: K8s 的持久化手法比傳統 Linux 更豐富。攻擊者不需要寫 crontab 或改 systemd,只要在 RBAC 加一條 ClusterRoleBinding,就擁有永久的叢集管理員權限。而且這條 Binding 藏在幾百個 RBAC 物件中,不主動審計根本不會被發現。
攻擊者如何從容器內的低權限提升到節點或叢集層級。
| 技術 ID | 技術名稱 | 說明 | 攻擊難度 |
|---|---|---|---|
| T1611 | Escape to Host | 容器逃逸——本矩陣最具技術深度的領域 | 高 |
| T1068 | Exploitation for Privilege Escalation | 利用核心漏洞提權(如 Dirty Pipe) | 高 |
| T1098 | Account Manipulation | RBAC 提權 | 低 |
| T1543 | Create/Modify System Process | 修改系統級別 process | 高 |
| T1053 | Scheduled Task/Job | 利用 Job 執行高權限操作 | 中 |
| T1078 | Valid Accounts | 利用高權限帳號 | 低 |
KOAD 場景: S13–S18 容器逃逸六式、S19 核心 CVE 提權
容器逃逸六式——Day 8–11 的核心內容:
| 手法 | 原理 | 前提 | KOAD |
|---|---|---|---|
| Privileged + mount | 特權容器可 mount 宿主機磁碟 | privileged: true |
S13 |
| Cgroup release_agent | 利用 cgroup 通知機制執行宿主機指令 | cgroup v1 + 寫入權限 | S14 |
| Docker.sock | 掛載 Docker socket 直接操作 Docker daemon | hostPath /var/run/docker.sock |
S15 |
| /proc core_pattern | 寫入 core_pattern 在 crash 時執行命令 | 可寫 /proc/sys/kernel/core_pattern |
S16 |
| SYS_PTRACE + HostPID | 附加到宿主機 process 注入 shellcode | SYS_PTRACE cap + hostPID: true |
S17 |
| lxcfs | 利用 lxcfs 的 devices.allow 建立裝置節點 | lxcfs 環境 + mknod 能力 | S18 |
這六種逃逸手法將在 Day 8–11 逐一拆解,每個場景都可以在 KOAD 靶場中實際操作。
攻擊者如何隱藏自己的行動。
| 技術 ID | 技術名稱 | 說明 |
|---|---|---|
| T1612 | Build Image on Host | 在宿主機上建構惡意映像,繞過 Registry 審計 |
| T1070 | Indicator Removal | 清除 bash_history、Pod 日誌、K8s Events |
| T1036 | Masquerading | 將惡意 Pod 命名為系統元件(如 kube-proxy) |
| T1078 | Valid Accounts | 使用合法帳號活動,不觸發異常偵測 |
KOAD 場景: S20 宿主機建映像、S21 痕跡清除、S22 偽裝系統元件
為什麼隱匿重要: 真正的攻擊者不會像 KOAD 測試那樣一次觸發 174 條 Falco 告警。他們會用合法帳號、合法映像、合法操作來掩護自己。偽裝成 kube-proxy 的 Pod 在 kubectl get pods 裡看起來完全正常——除非你仔細比對映像 hash。
攻擊者如何癱瘓你的安全監控。
| 技術 ID | 技術名稱 | 說明 |
|---|---|---|
| T1685 | Disable or Modify Tools | 刪除 Falco DaemonSet、修改 Audit Policy、移除 Kyverno |
KOAD 場景: S23 停用安全工具
關鍵觀念: 在 K8s 中,安全工具本身就是叢集內的工作負載。攻擊者如果有 cluster-admin 權限,一條 kubectl delete ds falco -n falco 就能讓你的 Runtime 偵測全面失效。這是為什麼 RBAC 最小權限如此重要——保護安全工具的 Namespace 應該有獨立的、限制極嚴格的 RBAC。
攻擊者如何竊取叢集中的機密資訊。
| 技術 ID | 技術名稱 | 說明 |
|---|---|---|
| T1110 | Brute Force | 對 Dashboard/API Server 暴力破解 |
| T1528 | Steal Application Access Token | 從環境變數或 ConfigMap 竊取 API Token |
| T1552 | Unsecured Credentials | 讀取未加密的 Secrets、SA Token、docker config |
KOAD 場景: S24 暴力破解、S25 竊取 Token、S26 明文憑證
你可能不知道的事實: K8s Secret 預設只是 base64 編碼,不是加密。kubectl get secret db-password -o jsonpath='{.data.password}' | base64 -d 就能看到明文。如果 etcd 沒有啟用靜態加密(encryption at rest),任何能讀 etcd 的人都能拿到所有 Secret。
攻擊者如何了解叢集的全貌。
| 技術 ID | 技術名稱 | 說明 |
|---|---|---|
| T1613 | Container and Resource Discovery | 列舉 Pod、Namespace、Node、SA |
| T1046 | Network Service Discovery | nmap 掃描 Service CIDR 和 Pod CIDR |
| T1069 | Permission Groups Discovery | 列舉 RBAC 權限(kubectl auth can-i) |
KOAD 場景: S27 資源列舉、S28 網路掃描、S29 RBAC 探測
攻擊者如何從一個 Namespace 移動到另一個。
| 技術 ID | 技術名稱 | 說明 |
|---|---|---|
| T1550 | Use Alternate Authentication Material | 使用竊取的 SA Token 存取其他 Namespace |
KOAD 場景: S30 跨 Namespace Token 橫向移動
關鍵觀念: K8s 的 Namespace 不是安全邊界。如果 RBAC 配置不當,攻擊者拿到一個 cluster-admin 的 SA Token 就能存取所有 Namespace 的資源。真正的隔離需要 NetworkPolicy + RBAC + 獨立叢集三管齊下。
攻擊者最終造成的破壞。
| 技術 ID | 技術名稱 | 說明 |
|---|---|---|
| T1485 | Data Destruction | 刪除 Deployment、PVC(Persistent Volume Claim,Pod 申請持久儲存空間的資源請求),破壞工作負載 |
| T1499 | Endpoint Denial of Service | Resource Bomb 耗盡 CPU/Memory |
| T1490 | Inhibit System Recovery | 刪除 Backup CronJob,阻止災難復原 |
| T1498 | Network Denial of Service | 大量 Pod 消耗 Service CIDR / iptables 規則 |
| T1496 | Resource Hijacking | 部署挖礦程式劫持運算資源 |
KOAD 場景: S31 資料破壞、S32 Resource Bomb、S33 阻止恢復、S34 網路 DoS、S35 挖礦劫持
挖礦是最常見的 K8s 攻擊目標: 根據 Sysdig 2025 Container Security Report,超過 65% 的容器入侵事件最終目的是挖礦。因為 K8s 叢集通常有大量 CPU 和自動擴展能力——對攻擊者來說,這就是免費的算力。
微軟在 2020 年發布了 Kubernetes 威脅矩陣,從另一個維度切入:
| 維度 | MITRE ATT&CK | 微軟 K8s 矩陣 |
|---|---|---|
| 組織方式 | 戰術 × 技術 | 攻擊面 × 手法 |
| 重點 | 攻擊者做了什麼 | 攻擊面在哪裡 |
| 覆蓋範圍 | 通用容器 | 專注 K8s + 雲端 |
微軟矩陣的三大攻擊面:
兩者高度互補——ATT&CK 適合設計偵測規則,微軟矩陣適合盤點攻擊面。KOAD 以 ATT&CK 為主架構,同時覆蓋微軟矩陣的所有攻擊面。
OWASP 在 2025 年更新的 K8s Top 10 與 ATT&CK 技術的對應:
| OWASP K8s | 說明 | 對應 ATT&CK | KOAD 場景 |
|---|---|---|---|
| K01 | Insecure Workload Configuration | T1611, T1610 | S06, S13–S18 |
| K02 | Supply Chain Vulnerabilities | T1525, T1068 | S12, S19 |
| K03 | Overly Permissive RBAC | T1098, T1078 | S09, S10 |
| K04 | Lack of Centralized Policy | T1685 | S23 |
| K05 | Inadequate Logging / Monitoring | T1070 | S21 |
| K06 | Broken Authentication | T1110, T1552 | S24, S26 |
| K07 | Missing Network Segmentation | T1550, T1046 | S28, S30 |
| K08 | Secrets Management Failures | T1552, T1528 | S25, S26 |
| K09 | Misconfigured Cluster Components | T1133 | S02 |
| K10 | Outdated / Vulnerable Components | T1068 | S19 |
如果你正在準備 CKS(Certified Kubernetes Security Specialist)認證,ATT&CK 矩陣可以幫助你理解每個考試領域對應的攻擊場景:
| CKS 領域 | 權重 | 對應 ATT&CK 戰術 | KOAD 場景 | 文章天數 |
|---|---|---|---|---|
| Cluster Setup | 15% | TA0001 Initial Access | S01–S03 | Day 2–3 |
| Cluster Hardening | 15% | TA0003, TA0006 | S09–S12, S24–S26 | Day 6–7, 16–17 |
| System Hardening | 10% | TA0004 Privilege Escalation | S13–S19 | Day 8–13 |
| Minimize Microservice | 20% | TA0004, TA0040 | S13–S19, S31–S35 | Day 8–13, 20–21 |
| Supply Chain Security | 20% | TA0005 Stealth | S12, S20, S23–S24 | Day 22–23 |
| Monitoring/Runtime | 20% | TA0112 Defense Impairment | S23, S26–S29 | Day 25–27 |
KOAD(Kubernetes Offensive and Active Defense Lab)是本系列的核心專案:
kubectl apply + 手動攻擊bash setup.sh 在 Minikube 上 5 分鐘內完成全部場景
在動手之前,先認識這次會用到的工具——每一個都有明確的角色:
| 工具 | 是什麼 | 類比 | 本系列的角色 |
|---|---|---|---|
| Docker | 容器引擎,負責跑容器 | 水電瓦斯(基礎設施) | 提供容器運行環境 |
| Minikube | 本地單節點 K8s 叢集 | 練習用的小操場 | 不需要雲端帳號,本地就能跑完整 K8s |
| kubectl | K8s 的命令列工具 | 搖控器 | 你和叢集溝通的唯一方式 |
| Helm | K8s 的套件管理器 | 像 apt/brew | 一條指令裝好 Falco(500+ 行 YAML) |
| Falco | Runtime 威脅偵測 | 監視器 + 保全 | 即時偵測容器內異常行為,發出告警 |
| Kyverno | K8s 策略引擎 | 機場安檢門 | 檢查 Pod 是否符合安全策略 |
| Calico | CNI 網路插件 | 大樓的隔間牆 | 實作 NetworkPolicy,讓網路隔離生效 |
# 列出 Pod
kubectl get pods -n koad # 指定 Namespace
kubectl get pods -A # 所有 Namespace
# 查看詳細資訊(除錯必備)
kubectl describe pod <name> -n koad
# 查看 Pod 日誌
kubectl logs <name> -n koad # 一次性
kubectl logs -f <name> -n koad # 持續追蹤(像 tail -f)
# 進入容器(本系列最常用)
kubectl exec -it <name> -n koad -- bash
# -i = 互動模式, -t = 分配終端, -- 後面是容器內指令
# 套用 / 刪除 YAML
kubectl apply -f pod.yaml
kubectl delete -f pod.yaml
# 我有什麼權限?
kubectl auth can-i --list
K8s 的所有資源都用 YAML 定義。每個 K8s YAML 都有四個固定欄位:
apiVersion: v1 # API 版本
kind: Pod # 資源類型(Pod / Deployment / Service...)
metadata: # 元資料(名稱、標籤、Namespace)
name: my-pod
namespace: koad
spec: # 規格(你想要什麼)
containers:
- name: web
image: nginx:1.25
YAML 注意事項:
name: value(對)、name:value(錯)- 開頭:每個 - 是一個元素接下來是動手時間。以下步驟會在你的本地環境建立一座完整的攻防靶場。
KOAD 靶場是一個獨立的 GitHub 專案,包含所有場景 YAML、靶機應用、防禦配置。第一步是把它 clone 下來:
# 主機終端
git clone https://github.com/fei3363/koad.git
cd koad
什麼是
git clone? 就是把 GitHub 上的專案完整下載到你的電腦。執行後會在目前資料夾建立一個koad/資料夾,裡面包含所有檔案。後續所有指令都在這個目錄下執行。
Clone 完成後,目錄結構如下:
koad/
├── setup.sh # 一鍵部署(可選,自動執行下面所有步驟)
├── teardown.sh # 清理環境
├── scenarios/ # 35 個攻擊場景 YAML
│ ├── initial-access/ # S01-S03
│ ├── execution/ # S04-S08
│ ├── persistence/ # S09-S12
│ └── ... # 共 10 個戰術目錄
├── apps/ # 靶機應用程式原始碼 + Dockerfile
├── defense/ # 防禦元件(Falco、Kyverno、seccomp...)
├── attacker/ # 攻擊者工具箱
└── images/ # 攻擊用容器映像
快速部署捷徑: 如果你想跳過手動步驟,直接
bash setup.sh會自動執行 Step 1-7 的全部內容。但建議第一次跟著手動操作,理解每一步在做什麼。
硬體:
| 項目 | 最低需求 | 建議配置 |
|---|---|---|
| CPU | 4 核心 | 8 核心 |
| 記憶體 | 8 GB | 16 GB |
| 磁碟空間 | 50 GB 可用 | 100 GB 可用 |
軟體:
| 工具 | 版本 | 用途 |
|---|---|---|
| Docker | 24+ | 容器運行環境 |
| Minikube | v1.38+ | 本地 K8s 叢集 |
| kubectl | v1.30+ | K8s CLI |
| Helm | v3.17+ / v4+ | 部署 Falco / Kyverno |
# 主機終端
# Docker
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable docker && sudo systemctl start docker
sudo usermod -aG docker $USER
# 執行完後,登出再登入(或 newgrp docker)讓群組生效
# Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl
# Helm(推薦 snap,可繞過某些網路問題)
sudo snap install helm --classic
# 主機終端(需要先安裝 Homebrew:https://brew.sh)
brew install minikube kubectl helm
# Docker:macOS 需要 Docker Desktop
# 下載安裝:https://www.docker.com/products/docker-desktop/
# 安裝後開啟 Docker Desktop,確認 Docker Engine Running
# PowerShell(以系統管理員執行)
# 前提:啟用 WSL2(Windows Subsystem for Linux 2)
wsl --install
# 安裝 Docker Desktop(會自動使用 WSL2 後端)
# 下載:https://www.docker.com/products/docker-desktop/
# 使用 winget 安裝其他工具
winget install Kubernetes.minikube
winget install Kubernetes.kubectl
winget install Helm.Helm
# 建議在 WSL2 的 Ubuntu 環境中操作,體驗最接近 Linux
# 主機終端
docker version --format '{{.Client.Version}}'
kubectl version --client --short
minikube version --short
helm version --short
四個指令都顯示版本號就表示安裝完成。
# 主機終端
minikube start \
--driver=docker \
--cpus=4 \
--memory=8192 \
--kubernetes-version=v1.30.0 \
--cni=calico
參數考量:
--driver=docker:Docker driver 最穩定,但容器逃逸場景會受限於 Docker-in-Docker--cni=calico:選用 Calico 是因為它支援 NetworkPolicy(Minikube 預設 CNI 不支援)--kubernetes-version=v1.30.0:固定版本確保場景行為一致等待 Node 就緒:
# 主機終端
kubectl wait --for=condition=Ready node/minikube --timeout=120s
踩坑 #1:Node NotReady
Calico CNI 需要時間啟動。剛跑完minikube start就用kubectl get nodes會看到NotReady。等 30–60 秒讓 Calico Pod 完全啟動即可。
# 主機終端
for ns in koad koad-attack koad-defense koad-registry koad-production; do
kubectl create namespace "$ns"
done
| Namespace | 用途 |
|---|---|
koad |
主要攻擊場景(S01–S35 大部分在這裡) |
koad-attack |
攻擊者工具 |
koad-defense |
防禦工具 |
koad-registry |
私有 Registry(S12 映像植入) |
koad-production |
模擬生產環境(S30 橫向移動目標) |
# 主機終端
# SSRF 漏洞 Web App(Day 2 會詳細解說)
minikube image build -t koad/vulnerable-webapp:latest apps/vulnerable-webapp/
# 模擬雲端 Metadata API
minikube image build -t koad/mock-metadata:latest apps/mock-metadata/
# 暴力破解工具
minikube image build -t koad/brute-forcer:latest apps/brute-forcer/
踩坑 #2:Docker 權限問題
如果你使用 snap 安裝的 Docker,直接docker build會遇到permission denied讀不到~/.minikube/certs/ca.pem。解法是使用minikube image build——它直接在 Minikube VM 裡建構,不需要本地 Docker 存取 Minikube 的憑證。
# 主機終端 — 一次部署全部場景
for dir in initial-access execution persistence privilege-escalation \
stealth defense-impairment credential-access discovery \
lateral-movement impact; do
kubectl apply -f scenarios/$dir/
done
驗證部署:
$ kubectl get pods -n koad
NAME READY STATUS AGE
attacker 1/1 Running 38m
brute-forcer 1/1 Running 38m
cred-stealer 1/1 Running 38m
critical-app-5776fdb957-dfxqr 1/1 Running 38m
dind-escape 1/1 Running 38m
monitoring-agent-775b8dc8d4-rd7fv 1/1 Running 38m ← S35 挖礦偽裝
privileged-pod 1/1 Running 38m
...
踩坑 #3:bitnami/kubectl:1.30 not found
Bitnami 的映像 tag 命名規則變更,1.30已不是有效 tag。解法:sed -i 's|bitnami/kubectl:1.30|bitnami/kubectl:latest|g' scenarios/**/*.yaml
踩坑 #4:kube-system PodSecurity 限制
S22 偽裝 Pod 原本要部署到kube-system(模擬真實攻擊),但 K8s 1.25+ 對kube-system啟用 PodSecurity Standards(Restricted level),Pod 會被立即刪除。解法是改部署到koadnamespace,在文章中說明真實攻擊的行為。
Falco 是什麼? 雲原生的即時安全監控工具(CNCF 專案)。它在 Linux 核心層監聽系統呼叫(syscall)——容器內的任何動作(讀檔案、開 socket、執行指令)最終都要呼叫核心,Falco 就在那裡攔截並比對規則。偵測到異常就發告警,像大樓的監視器——不能阻止入侵,但第一時間通知你。
在本系列中,每次攻擊步驟旁邊的 Falco 觀察 就是 Falco 產生的告警。
# 主機終端
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco falcosecurity/falco \
-n falco --create-namespace \
-f defense/falco/values-custom.yaml
KOAD 的 Falco 配置重點:
modern_ebpf——使用 eBPF 而非 kernel module,Docker-in-Docker 環境更穩定踩坑 #5:Falco chart v9 棄用 gRPC 設定
Falco 0.44+ 的 Helm chart 移除了falco.grpc和falco.grpc_output設定。如果你從舊版 values 複製過來,會遇到 template 錯誤。移除這兩個區塊即可。
踩坑 #6:rules_file 與 rules_files 衝突
Falco 0.44 使用rules_files(複數),Helm chart 會自動設定。如果你在 values 裡又寫了rules_file(單數),會因為兩者同時存在而報驗證錯誤。自訂規則改用customRules區塊。
踩坑 #7:inotify handler 初始化失敗
Minikube Docker driver 環境中,inotify 的max_user_instances受限。解法是在 values 中設定watch_config_files: false,或在主機上sudo sysctl -w fs.inotify.max_user_instances=1024。
驗證 Falco 規則觸發:
$ kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=5
{"rule":"KOAD S05 kubectl Execution in Container","priority":"Critical",...}
{"rule":"KOAD S26 SA Token Read","priority":"Warning",...}
{"rule":"KOAD S13 Privileged Container Started","priority":"Critical",...}
Kyverno 是什麼? K8s 原生的 Policy-as-Code 引擎。當有人
kubectl apply建立 Pod 時,Kyverno 在 API Server 前面攔截請求,檢查是否符合安全策略——像機場安檢門,不合規的 Pod 直接被拒絕(Enforce 模式)或記錄在案(Audit 模式)。KOAD 使用 Audit 模式,讓攻擊能執行但記錄違規。
# 主機終端
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno \
-n kyverno --create-namespace
# 部署 KOAD 策略(Audit 模式)
kubectl apply -f defense/kyverno/policies.yaml
KOAD 的 7 條 Kyverno 策略(全部 Audit 模式,不阻擋,只記錄):
| 策略 | 偵測內容 |
|---|---|
| koad-block-privileged | 特權容器 |
| koad-block-hostpath | HostPath 掛載 |
| koad-block-host-namespaces | HostPID / HostNetwork / HostIPC |
| koad-require-trusted-registry | 非信任映像來源 |
| koad-require-run-as-nonroot | Root 容器 |
| koad-disable-automount-sa | SA Token 自動掛載 |
| koad-drop-capabilities | 未刪除的 Linux capabilities |
為什麼用 Audit 而不是 Enforce?因為 KOAD 是攻防靶場——攻擊場景本身就是「違規」的。Audit 模式讓攻擊能正常執行,同時記錄所有違規事件,方便後續分析。
# 主機終端
kubectl apply -f defense/network-policies/default-deny.yaml
部署 4 條策略:
default-deny-all:預設阻擋所有進出流量allow-dns:允許 DNS 查詢allow-ssrf-webapp-ingress:允許 SSRF webapp 的 ingressblock-metadata-api:阻擋 169.254.169.254 metadata API 存取全部部署完成後,確認以下指標:
# Pod 狀態
$ kubectl get pods -n koad | grep -c Running
37
# Falco
$ kubectl get pods -n falco
falco-xxxxx 2/2 Running
falco-falcosidekick-xxxxx 1/1 Running
# Kyverno
$ kubectl get cpol | head -5
NAME ADMISSION BACKGROUND READY
koad-block-host-namespaces true true True
koad-block-hostpath true true True
koad-block-privileged true true True
...
# NetworkPolicy
$ kubectl get networkpolicies -n koad
default-deny-all ...
allow-dns ...

| 服務 | 存取方式 | 埠號 |
|---|---|---|
| SSRF Webapp | minikube service ssrf-webapp -n koad --url |
30080 |
| Jupyter Notebook | minikube service jupyter-insecure -n koad --url |
30088 |
| K8s Dashboard(假) | minikube service kube-dashboard -n koad --url |
30443 |
| Private Registry | minikube service private-registry -n koad-registry --url |
30500 |
| Falcosidekick UI | kubectl port-forward svc/falco-falcosidekick-ui -n falco 2802 |
2802 |
KOAD 拉取的映像 + 建構的容器會佔用大量磁碟空間。如果遇到 Docker is out of disk space:
docker system df # 檢查使用情況
docker system prune -a -f --volumes # 清理未使用的映像
建議在部署前確保至少有 50 GB 可用空間。
# 清除所有 KOAD 資源
bash teardown.sh
# 完全刪除 Minikube 叢集
minikube delete
| 天數 | 主題 | 類型 |
|---|---|---|
| Day 1 | ATT&CK 全景 + KOAD 部署 | 綜合 |
| Day 2 | 三條入侵路徑:SSRF + 暴露服務 + 洩漏憑證 | 攻擊 |
| Day 3 | 防禦初始存取:API Server 強化 + NetworkPolicy | 防禦 |
| Day 4 | 四種執行手法:Web Shell + kubectl + Pod + CronJob | 攻擊 |
| Day 5 | 防禦執行:Admission Control + RBAC 最小權限 | 防禦 |
| Day 6 | 五種持久化:RBAC + SA + Sidecar + 映像 + StaticPod | 攻擊 |
| Day 7 | 防禦持久化:Audit Log + RBAC 監控 + 映像簽章 | 防禦 |
| Day 8 | 逃逸第一式:Privileged mount device | 攻擊 |
| Day 9 | 逃逸第二、三式:Cgroup + lxcfs | 攻擊 |
| Day 10 | 逃逸第四、五式:Docker.sock + /proc core_pattern | 攻擊 |
| Day 11 | 逃逸第六式 + 核心 CVE:SYS_PTRACE + Dirty Pipe | 攻擊 |
| Day 12 | 防禦逃逸(上):PSS + seccomp + AppArmor | 防禦 |
| Day 13 | 防禦逃逸(下):gVisor + 容器不變性 | 防禦 |
| Day 14 | 隱匿三連:偽裝 + 清痕 + 建映像 | 攻擊 |
| Day 15 | 防禦破壞:停用 Falco + 竄改 Audit | 攻擊 |
| Day 16 | 三種憑證竊取:暴力破解 + Token + 明文 | 攻擊 |
| Day 17 | 防禦憑證:etcd 加密 + Secret 管理 | 防禦 |
| Day 18 | 偵察全攻略:資源列舉 + 網路掃描 + RBAC 探測 | 攻擊 |
| Day 19 | 橫向移動:竊取 Token 跨 Namespace | 攻擊 |
| Day 20 | 五種破壞:資料銷毀 + DoS + 挖礦 | 攻擊 |
| Day 21 | 防禦影響:ResourceQuota + PDB + 備份 | 防禦 |
| Day 22 | 供應鏈攻擊:映像藏密 + Registry + CI/CD | 攻擊 |
| Day 23 | 防禦供應鏈:簽章 + 掃描 + ImagePolicy | 防禦 |
| Day 24 | KOAD Kill Chain:35 場景全自動攻擊 | 攻擊 |
| Day 25 | Falco 實戰:自訂規則覆蓋全 ATT&CK | 防禦 |
| Day 26 | Falco Talon + Tetragon + Audit Log | 防禦 |
| Day 27 | NetworkPolicy + Kyverno + CIS Benchmark | 防禦 |
| Day 28 | KOAD 攻防矩陣:ATT&CK × D3FEND 對照 | 綜合 |
| Day 29 | Incident Response:當 Falco 告警響起 | 防禦 |
| Day 30 | KOAD 開源 +「資安這條路」的下一站 | 綜合 |
不需要依序讀完 30 天。根據你的目標選擇路線:
Day 1 → 2 → 3 → 4 → 5 → 8 → 12 → 24 → 30
先建立攻防全景觀,體驗一條完整的攻擊鏈,再看防禦手段。跳過進階逃逸和隱匿手法。
Day 1 → 2 → 3 → ... → 30(依序)
攻擊與防禦交替,每個戰術都有動手實作。適合想全面掌握 K8s 安全的讀者。
Day 1 → 3 → 5 → 7 → 12 → 13 → 16 → 17 → 22 → 23 → 25 → 27 → 29
聚焦防禦側,涵蓋 CKS 六大領域:Cluster Setup、Hardening、System Hardening、Microservice、Supply Chain、Monitoring。
| 天數 | 前置條件 |
|---|---|
| Day 2-7 | Day 1(環境部署) |
| Day 8-11 | Day 4(需要理解 Execution 才懂逃逸) |
| Day 12-13 | Day 8(需要理解逃逸才懂防禦) |
| Day 24 | Day 1-23(Kill Chain 串聯所有戰術) |
| Day 28 | Day 1(ATT&CK 矩陣)+ 至少完成一條攻擊路線 |
| Day 29 | Day 25(需要 Falco 基礎) |
| 症狀 | 原因 | 解法 |
|---|---|---|
| Node 一直 NotReady | Calico CNI 未啟動 | kubectl get pods -n kube-system 等 Calico Pod Running |
| Pod ImagePullBackOff | 自訂映像未建構 | 回到 Step 4 執行 minikube image build |
| Falco Pod CrashLoopBackOff | values.yaml 格式錯誤 | 確認移除 falco.grpc 區塊、使用 rules_files |
minikube start 失敗 |
Docker 未啟動或權限不足 | sudo systemctl start docker && sudo usermod -aG docker $USER |
| 磁碟空間不足 | 映像佔用空間 | docker system prune -a -f --volumes 後重試 |
本系列常出現的術語快速參照:
| 英文 | 中文 | 一句話說明 |
|---|---|---|
| Cluster | 叢集 | 一組 Node 組成的 K8s 環境 |
| Node | 節點 | 叢集中的一台機器 |
| Pod | Pod | K8s 最小部署單位 |
| Container | 容器 | 獨立運行的應用實體 |
| Image | 映像 | 容器的唯讀模板 |
| Namespace | 命名空間 | 叢集內的邏輯分區 |
| RBAC | 角色型存取控制 | 誰能做什麼 |
| ServiceAccount (SA) | 服務帳號 | Pod 的身份 |
| Secret | 機密 | 敏感資料(預設只 Base64) |
| NetworkPolicy | 網路策略 | Pod 間的防火牆規則 |
| CNI | 容器網路介面 | K8s 的網路插件標準 |
| Syscall | 系統呼叫 | 程式向核心請求服務的介面 |
| Capabilities | 能力 | Linux 把 root 權限拆成的 38 個細項 |
| Seccomp | 安全計算模式 | 限制容器可用的 syscall |
| eBPF | 擴展伯克利封包過濾器 | Linux 核心內的可程式化框架(Falco 用它) |
| ATT&CK | 對手戰術技術知識庫 | MITRE 維護的攻擊知識庫 |
| Kill Chain | 殺傷鏈 | 攻擊從入侵到造成影響的完整路徑 |
| PSS | Pod 安全標準 | K8s 內建的三級 Pod 安全基準(Privileged / Baseline / Restricted) |
| AppArmor | 應用程式裝甲 | Linux 核心的強制存取控制模組,限制程式能存取的檔案和能力 |
| gVisor | 應用程式核心 | Google 開源的容器 sandbox runtime,用使用者空間核心攔截 syscall |
| Kyverno | K8s 策略引擎 | 用 YAML 寫的 Admission Controller,驗證和變更 K8s 資源 |
| Admission Controller | 准入控制器 | API Server 在寫入 etcd 前攔截請求的插件(驗證或變更) |
| CRD | 自訂資源定義 | 擴展 K8s API 的機制,讓你定義自己的資源類型 |
| Tetragon | eBPF 安全觀測 | Cilium 出品的 eBPF runtime 安全工具,可追蹤程序、檔案、網路行為 |
| OCI | 開放容器標準 | 容器映像和 runtime 的業界標準規範 |
| CRI | 容器 Runtime 介面 | K8s 與容器 runtime(containerd / CRI-O)之間的標準介面 |
| Namespace (Linux) | Linux 命名空間 | 核心級隔離機制(PID / Network / Mount 等),容器隔離的基礎 |
| cgroup | 控制群組 | Linux 核心的資源限制機制(CPU / 記憶體),也是容器逃逸的攻擊面 |
minikube service ssrf-webapp -n koad --url)明天開始進入正題——Day 2 從 TA0001 Initial Access 開始,實際操作 SSRF 攻擊、kubelet 探測和 kubeconfig 洩漏三條入侵路徑。